/**
 *
 * @author luguoxiang
 * @Date: 2025/9/29
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */

/**
 * 子串联想，根据输入联想出可能的字串
 * @param {string} input - 输入，如 'sys/auth/user/list' 或 'sysAuthUserList'
 * @param {'auto'|'camel'|string} separator - 分隔符，如 'camel' 或 '/' 或 ':'
 */
export function substringAssociation(input: string, separator: 'auto'|'camel'|string = 'auto') {

  /**
   * 查找分隔符
   * @param str
   */
  function findSeparator(str: string) {
    // 遍历字符串，逐个检查每个字符
    for (let i = 0; i < str.length; i++) {
      const char = str[i];
      // 检查是否为字母、数字 或 中文字符
      if (!/^[a-zA-Z0-9\u4e00-\u9fa5]$/.test(char)) {
        return char;
      }
    }
    return 'camel';
  }

  /**
   * 将输入（路径或驼峰）拆分为单词数组
   */
  function tokenize(input: string, separator: string): string[] {
    input = input.trim();
    if (separator !== 'camel') {
      // 路径形式：按 separator 分割，过滤空
      return input.split(separator).filter(Boolean);
    } else {
      // 驼峰形式：按大写字母分割
      // 例如：sysAuthUserList → ['sys', 'Auth', 'User', 'List']
      const matches = input.match(/[A-Z]?[a-z]+|[A-Z]+(?=[A-Z]|$)/g) || [];
      return matches.map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase());
    }
  }

  /**
   * 将单词数组按驼峰规则拼接（首词小写，其余首字母大写）
   */
  function toCamelCase(words: string[]) {
    if (words.length === 0) return '';
    return words[0].toLowerCase() + words.slice(1).map(w =>
      w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()
    ).join('');
  }
  // 默认输出风格：如果输入含 /，则输出 path；否则 camel
  if (separator === 'auto') {
    separator = findSeparator(input);
  }
  // 先拆分
  const tokens = tokenize(input, separator);
  if (tokens.length === 0) return [];
  // 结果处理方法
  const handle = separator === 'camel' ? toCamelCase : (words: string[]) => words.join(separator);
  // 处理数据
  const results = [];
  for (let i = 0; i < tokens.length; i++) {
    for (let j = i; j < tokens.length; j++) {
      const subTokens = tokens.slice(i, j + 1);
      results.push(handle(subTokens));
    }
  }
  return results;
}
